/******************************************************************************

    Copyright (C) 2019 ErisedMedia
    All Rights Reserved.

    This source code and any compilation or derivative thereof is the
    proprietary information of ErisedMedia and is
    confidential in nature.
    Under no circumstances is this software to be exposed to or placed under an
    Open Source License of any type without the expressed written permission of
    ErisedMedia.

******************************************************************************/

/******************************************************************************

    File:   Jpeg.h
    Brief:  Jpeg的头文件,jpeg编解码接口封装.

******************************************************************************/

/******************************************************************************

    Rev     Date        Author      Comments
--------------------------------------------------------------------------------
    001     20190524    RunyuanYe        Original

--------------------------------------------------------------------------------
    For consistency and standardisation retain the Section Separators.

*******************************************************************************/

#ifndef _JPEG_H_
#define _JPEG_H_

/******************************************************************************
*
*   INCLUDE FILES
*
******************************************************************************/

#include "Head.h"

/******************************************************************************
*
*   MACROS
*
******************************************************************************/


/******************************************************************************
*
*   TYPEDEFS
*
******************************************************************************/


/******************************************************************************
*
*   EXPORT DATA
*
******************************************************************************/


/******************************************************************************
*
*   EXPORT FUNCTION PROTOTYPES
*
******************************************************************************/

/*
    创建JPEG解码器函数

    成功返回解码器句柄, 失败返回nullptr
*/
void* CreateDecodeJPEG();

/*
    销毁JPEG解码器函数

    handle： 解码器句柄
*/
void DestroyDecodeJPEG(void* handle);

#if defined USE_OPENCV
/*
    JPEG解码函数

    handle： 解码器句柄
    jpgBuf： jpeg图片编码数据缓存
    size： jpeg图片编码数据大小
    image： 输出解码后的图片

    成功返回0, 失败返回非0
*/
int DecodeJPEG(void* handle, const void* jpgBuf, int size, Mat& image);
#endif

/*
    JPEG解码函数

    handle： 解码器句柄
    jpgBuf： jpeg图片编码数据缓存
    size： jpeg图片编码数据大小
    pimage： 输出解码后的图片缓存指针，使用完需要手工调用DecodeFree释放内存
    pwidth: 输出解码后的图片宽度
    pheight: 输出解码后的图片高度
    pstride: 输出解码后的图片跨度

    成功返回0, 失败返回非0
*/
int DecodeJPEGEx(void* handle, const void* jpgBuf, int size, void** pimage, int* pwidth, int* pheight, int* pstride);

/*
    JPEG解码函数

    handle： 解码器句柄
    jpgBuf： jpeg图片编码数据缓存
    size： jpeg图片编码数据大小
    pimage： 输出解码后的图片缓存指针，使用完需要手工调用DecodeFree释放内存
    pwidth: 输出解码后的图片宽度
    pheight: 输出解码后的图片高度
    pstride: 输出解码后的图片跨度

    成功返回0, 失败返回非0
*/
int DecodeJPEGYUVEx(void* handle, const void* jpgBuf, int size, void** pimage, int* pwidth, int* pheight, int* pstride);

/*
    图像内存释放函数

    与DecodeJPEGEx函数配套使用

    image： 图像内存

*/
void DecodeFree(void* image);

/*
    创建JPEG编码器函数

    成功返回编码器句柄, 失败返回nullptr
*/
void* CreateEncodeJPEG();

/*
    销毁JPEG编码器函数

    handle： 编码器句柄
*/
void DestroyEncodeJPEG(void* handle);

#if defined USE_OPENCV
/*
    JPEG编码函数

    handle： 编码器句柄
    image： 输入需要编码的图片
    jpgBuf： 输出jpeg图片编码后的数据缓存

    成功返回0, 失败返回非0
*/
int EncodeJPEG(void* handle, Mat& image, vector<unsigned char>& jpgBuf);
#endif

/*
    JPEG编码函数

    handle： 编码器句柄
    imageData： 输入需要编码的图片内存地址
    width：输入的图片宽度
    height：输入的图片高度
    stride：输入的图片一行内存跨度
    jpgBuf： 输出jpeg图片编码后的数据缓存

    成功返回0, 失败返回非0
*/
int EncodeJPEGEx(void* handle, void* imageData, int width, int height, int stride, vector<unsigned char>& jpgBuf);

/*
    JPEG编码函数

    handle： 编码器句柄
    imageData： 输入需要编码的图片内存地址
    width：输入的图片宽度
    height：输入的图片高度
    stride：输入的图片一行内存跨度
    ppjpgBuf： 输出jpeg图片编码后的数据缓存地址
    pjpgSize: 输出jpeg图片编码后的数据缓存大小

    成功返回0, 失败返回非0
*/
int EncodeJPEGEx2(void* handle, void* imageData, int width, int height, int stride, void** ppjpgBuf, int* pjpgSize);

/*
    图像内存释放函数

    与EncodeJPEGEx2函数配套使用

    image： 图像内存

*/
void EncodeFree(void* image);

#endif // _JPEG_H_
